from django.utils import simplejson
from comunidadcyt.Registration_Users.models import User
from comunidadcyt.gruposDeInvestigacion.models import GruposDeInvestigacion
from comunidadcyt.departamentos.models import Departamentos
from comunidadcyt.lineasDeInvestigacion.models import LineasDeInvestigacion
from comunidadcyt.proyectos.models import Proyectos
from comunidadcyt.partners.models import Partners
from django.http import HttpResponse
from django.shortcuts import render_to_response
from django.db.models import Q
from comunidadcyt.cargoAcademico.models import CargoAcademico
from django.template.context import RequestContext

# Create your views here.
def autocomplete_user_list(request,key_xhr):
    response_dict = {}
    list = []
    term = request.GET.__getitem__('term')
    
    luq = User.objects.filter(Q(first_name__icontains = term) | Q(last_name__icontains = term))
    
    for item in luq:
        list.append({'id':item.id,'name':item.get_full_name()})
    
    response_dict.update({'list':list})
    
    return HttpResponse(simplejson.dumps(response_dict),mimetype = 'application/javascript')

def autocomplete_view(request,key_ac):
    response_dict = []
    term = request.GET.__getitem__('term')
    
    luq = list(User.objects.filter(first_name__icontains = term).values())
    lgq = list(GruposDeInvestigacion.objects.filter(Nombre_grupo__icontains = term).values())
    ldq = list(Departamentos.objects.filter(Nombre_departamento__icontains = term).values())
    liq = list(LineasDeInvestigacion.objects.filter(Nombre_linea__icontains = term).values())
    lpq = list(Proyectos.objects.filter(Nombre_proyecto__icontains = term).values())
    lrq = list(Partners.objects.filter(Nombre_partner__icontains = term).values())
    
    for item in luq:
        if 'first_name' in item:
            name = item['first_name']+' '+item['last_name']
            response_dict.append({'label': name,'category':'Usuarios'})
    
    for item in lgq:
        response_dict.append({'label':item['Nombre_grupo'],'category':'Grupos'})
     
    for item in ldq:
        response_dict.append({'label':item['Nombre_departamento'],'category':'Departamentos'})
     
    for item in liq:
        response_dict.append({'label':item['Nombre_linea'],'category':'Investigacion'})
        
    for item in lpq:
        response_dict.append({'label':item['Nombre_proyecto'],'category':'Proyectos'})
     
    for item in lrq:
        response_dict.append({'label':item['Nombre_partner'],'category':'Partners'})
    
    
    return HttpResponse(simplejson.dumps(response_dict),mimetype = 'application/javascript')

def exits_in_list(this_list,this_item):
    for item in this_list:
        if item == this_item:
            return True
    return False

def advanced_user_search(request):
    request.breadcrumbs('Resultado usuarios',request.path)
    gl = request.GET.getlist('u_grupos')
    cl = request.GET.getlist('u_cargo')
    pl = request.GET.getlist('u_proyecto')
    
    groups = []
    tcl = [] #filtrar los cargos segun lo electo
    prl = [] #lista parcial de resultados
    
    for group in gl:
        groups.append(GruposDeInvestigacion.objects.get(Nombre_grupo__exact = group))
        
    for g in groups:
        for member in g.Miembros.all():
            if not prl.__contains__(member):
                prl.append(member)
    
    for ca in cl:
        tcl.append(CargoAcademico.objects.get(Cargo__exact = ca))
    
    #Filtrar de acuerdo al cargo
    if cl != []:
        for g in groups:
            p = g.Miembros.all()
            for member in p:
                mp = member.get_profile()
                index = 0
                for item in mp.cargo.all():
                    if item.Cargo == cl[index].Cargo and not prl.__contains__(member):
                        prl.append(member)
                        break
                    index = index + 1
    #ahora tenemos una lista parcial, falta filtrar los miembros de cada grupo
    #que sobrevio el filtrado anterior de acuerdo a los proyectos en los que participan
    if pl != []:
        ap = []
        for p in pl:
            ap.append(Proyectos.objects.get(Nombre_proyecto__exact = p))
        for p in ap:
            for member in p.Miembros.all():
                if not prl.__contains__(member):
                    prl.append(member)
                    
    return render_to_response('search/advanced_result.html',{'search_type':'user','list':prl,'user':request.user},context_instance = RequestContext(request))

def advanced_group_search(request):
    ge_date = request.GET.getlist('g_fecha_creacion_ge')
    le_date = request.GET.getlist('g_fecha_creacion_le')
    members = request.GET.getlist('members')
    projects = request.GET.getlist('projects')
    
    if ge_date[0] != '' and le_date[0] != '': 
        g = GruposDeInvestigacion.objects.filter(Fecha_creacion__gte = ge_date[0]).filter(Fecha_creacion__lte = le_date[0])
    elif ge_date[0] != '':
        g = GruposDeInvestigacion.objects.filter(Fecha_creacion__gte = ge_date[0])
    elif le_date[0] != '':
        g = GruposDeInvestigacion.objects.filter(Fecha_creacion__lte = le_date[0])
    else:
        g = GruposDeInvestigacion.objects.all()
        
    mgf = []
    im = False
    ip = False
    for eg in g:
        for item in members:
            im = True
            for member in eg.Miembros.all():
                if item == member.get_full_name():
                    mgf.append(eg)
        for item in projects:
            ip = True
            for project in eg.proyectos.all():
                if item == project.Nombre_proyecto:
                    if not exits_in_list(this_list=mgf, this_item=eg):
                        mgf.append(eg)
        if not im and not ip:
            mgf.append(eg)
        else:
            ip = False
            im = False
    
    return render_to_response('search/advanced_result.html',{'search_type':'groups','list':mgf,'user':request.user})

def advanced_department_search(request):
    ge_date = request.GET.getlist('d_fecha_creacion_ge')
    le_date = request.GET.getlist('d_fecha_creacion_le')
    directors = request.GET.getlist('director')
    groups = request.GET.getlist('d_grupos')
    
    if ge_date[0] != '' and le_date[0] != '': 
        d = Departamentos.objects.filter(Fecha_creacion__gte = ge_date[0]).filter(Fecha_creacion__lte = le_date[0])
    elif ge_date[0] != '':
        d = Departamentos.objects.filter(Fecha_creacion__gte = ge_date[0])
    elif le_date[0] != '':
        d = Departamentos.objects.filter(Fecha_creacion__lte = le_date[0])
    else:
        d = Departamentos.objects.all()
    
    prl = []
    id = False
    ig = False
    for ed in d:
        if len(directors) > 0:
            dd = ed.Director
            id = True
            for edir in directors:
                if dd.get_full_name() == edir:
                    prl.append(ed)
                    break
        for eg in groups:
            ig = True
            for efg in ed.grupos.all():
                if eg == efg.Nombre_grupo:
                    if not prl.__contains__(ed):
                        prl.append(ed)
        
        if not id and not ig:
            prl.append(ed)
        else:
            id = False
            ig = False
            
    return render_to_response('search/advanced_result.html',{'search_type':'departments','list':prl,'user':request.user})

def advanced_project_search(request):
    fecha_inicio_ge = request.GET.getlist('p_fecha_creacion_ge')
    fecha_inicio_le = request.GET.getlist('p_fecha_creacion_le')
    grupos = request.GET.getlist('p_grupos')
    financiacion = request.GET.getlist('financiacion')
    
    if fecha_inicio_ge[0] != '' and fecha_inicio_le[0] != '': 
        pl = Proyectos.objects.filter(Fecha_inicio__gte = fecha_inicio_ge[0]).filter(Fecha_inicio__lte = fecha_inicio_le[0])
    elif fecha_inicio_ge[0] != '':
        pl = Proyectos.objects.filter(Fecha_inicio__gte = fecha_inicio_ge[0])
    elif fecha_inicio_le[0] != '':
        pl = Proyectos.objects.filter(Fecha_inicio__lte = fecha_inicio_le[0])
    else:
        pl = Proyectos.objects.all()
        
    prl = []
    ig = False
    for p in pl:
        for g in p.Grupos.all():
            ig = True
            for grupo in grupos:
                if grupo == g.Nombre_grupo and not prl.__contains__(p):
                    prl.append(p)
            
        for epfin in financiacion:
            ig = True
            if epfin == p.Fuente_de_financiamiento and not prl.__contains__(p):
                prl.append(p)
                
        if not ig:
            prl.append(p)
        else:
            ig = False 
                    
    return render_to_response('search/advanced_result.html',{'search_type':'projects','list':prl,'user':request.user})